package com.spring.redis.operation.service;

import com.spring.redis.operation.service.base.HashRedisBaseService;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * redis Operation hash interface
 *
 * @author zhouyu
 */
public interface HashRedisService extends HashRedisBaseService {

    /**
     * hash类型缓存
     *
     * @param clazz 实体类名称
     * @param field field
     * @param key   key
     * @param value value
     */
    void put(Class<?> clazz, String key, String field, Object value);

    /**
     * hash类型缓存
     *
     * @param className 自定义缓存名称
     * @param key       key
     * @param field     field
     * @param value     value
     */
    void put(String className, String key, String field, Object value);

    /**
     * hash类型批量缓存
     *
     * @param clazz 实体类名称
     * @param key   key
     * @param hash  hash
     */
    void putAll(Class<?> clazz, String key, Map<String, Object> hash);

    /**
     * hash类型批量缓存
     *
     * @param className 自定义缓存名称
     * @param key       key
     * @param hash      hash
     */
    void putAll(String className, String key, Map<String, Object> hash);

    /**
     * 获取hash类型缓存
     *
     * @param clazz 实体类名称
     * @param key   key
     * @param field field
     * @return java.lang.String
     */
    String get(Class<?> clazz, String key, String field);

    /**
     * 获取hash的所有field和value
     *
     * @param className 自定义缓存名称y
     * @param key       key
     * @return java.util.Map
     */
    Map<String, Object> getAll(String className, String key);

    /**
     * 获取hash的所有field和value
     *
     * @param clazz 自定义缓存名称y
     * @param key       key
     * @return java.util.Map
     */
    Map<String, Object> getAll(Class<?> clazz, String key);

    /**
     * 批量获取hash类型缓存
     *
     * @param clazz  实体类名称
     * @param key    key
     * @param fields field
     * @return java.util.List<String>
     */
    List<Object> getAll(Class<?> clazz, String key, String... fields);

    /**
     * 批量获取hash类型缓存
     *
     * @param className 自定义缓存名称
     * @param key       key
     * @param fields    fields
     * @return java.util.List<String>
     */
    List<Object> getAll(String className, String key, String... fields);

    /**
     * 获取hash类型缓存
     *
     * @param className 自定义缓存名称
     * @param key       key
     * @param field     field
     * @return java.lang.String
     */
    String get(String className, String key, String field);

    /**
     * 设置hash key过期时间
     *
     * @param clazz   实体类名称
     * @param key     key
     * @param seconds 过期时间
     */
    void expire(Class<?> clazz, String key, Long seconds);

    /**
     * 设置hash key过期时间
     *
     * @param className 自定义缓存名称
     * @param key       key
     * @param seconds   过期时间
     */
    void expire(String className, String key, Long seconds);

    /**
     * 删除hash类型字段缓存
     *
     * @param clazz  实体类名称
     * @param key    key
     * @param fields field
     */
    void remove(Class<?> clazz, String key, Object... fields);

    /**
     * 删除hash类型字段缓存
     *
     * @param className 自定义缓存名称
     * @param key       key
     * @param fields    field
     */
    void remove(String className, String key, Object... fields);

    /**
     * 删除hash类型缓存
     *
     * @param clazz 实体类名称
     * @param key   key
     */
    void remove(Class<?> clazz, String key);

    /**
     * 删除hash类型缓存
     *
     * @param className 自定义缓存名称
     * @param key       key
     */
    void remove(String className, String key);

    /**
     * 获取hash类型所有的key
     *
     * @param className 自定义缓存名称
     * @param key       key
     * @return java.util.Set<String>
     */
    Set<String> keys(String className, String key);

    /**
     * 获取hash类型所有的key
     *
     * @param clazz 类名
     * @param key   key
     * @return java.util.Set<String>
     */
    Set<String> keys(Class<?> clazz, String key);

    /**
     * 获取hash类型所有的value
     *
     * @param className 自定义缓存名称
     * @param key       key
     * @return java.util.List<Object>
     */
    List<Object> values(String className, String key);

    /**
     * 获取hash类型所有的value
     *
     * @param clazz 类名
     * @param key   key
     * @return java.util.List<Object>
     */
    List<Object> values(Class<?> clazz, String key);

    /**
     * 获取map的长度
     *
     * @param className 类名
     * @param key       key
     * @return java.lang.Long
     */
    Long size(String className, String key);

    /**
     * 获取map的长度
     *
     * @param clazz 类名
     * @param key   key
     * @return java.lang.Long
     */
    Long size(Class<?> clazz, String key);

    /**
     * 是否存在key
     *
     * @param className 类名
     * @param key       key
     * @return java.lang.Boolean
     */
    Boolean hasKey(String className, String key);

    /**
     * 是否存在key
     *
     * @param clazz 类名
     * @param key   key
     * @return java.lang.Boolean
     */
    Boolean hasKey(Class<?> clazz, String key);

    /**
     * 是否存在key对应的key
     *
     * @param className 类名
     * @param key       key
     * @param item      item
     * @return java.lang.Boolean
     */
    Boolean hasKeyItem(String className, String key, String item);

    /**
     * 是否存在key对应的key
     *
     * @param clazz 类名
     * @param key   key
     * @param item  item
     * @return java.lang.Boolean
     */
    Boolean hasKeyItem(Class<?> clazz, String key, String item);

}
